﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TPMS_ScanComparison.Helper
{
    public static class Simple10000Serial
    {
        public static class Serial10000Generator
        {
            // 线程安全锁：确保多线程环境下流水号生成唯一
            private static readonly object lockObject = new object();
            // 数据存储文件：保存三个序列的当前值
            private const string DataFile = "multiserials.dat";

            // 存储三个独立序列的当前值（初始为0，生成时+1后变为1）
            private static Dictionary<string, int> serialCounters = new Dictionary<string, int>();

            // 静态构造函数：程序启动时加载历史流水号数据
            static Serial10000Generator()
            {
                LoadSerialData();
            }

            /// <summary>
            /// 加载历史流水号数据
            /// </summary>
            private static void LoadSerialData()
            {
                // 初始化三个序列（默认从0开始，下次生成时变为1）
                serialCounters["SerialA"] = 0;
                serialCounters["SerialB"] = 0;
                serialCounters["SerialC"] = 0;

                // 若存在历史数据文件，读取并覆盖初始值
                if (File.Exists(DataFile))
                {
                    try
                    {
                        string[] lines = File.ReadAllLines(DataFile);
                        // 读取文件前3行，分别对应SerialA、SerialB、SerialC的当前值
                        if (lines.Length >= 3)
                        {
                            if (int.TryParse(lines[0], out int serialA))
                                serialCounters["SerialA"] = serialA;
                            if (int.TryParse(lines[1], out int serialB))
                                serialCounters["SerialB"] = serialB;
                            if (int.TryParse(lines[2], out int serialC))
                                serialCounters["SerialC"] = serialC;
                        }
                    }
                    catch
                    {
                        // 读取失败时仍使用初始值（避免程序崩溃）
                    }
                }
            }

            /// <summary>
            /// 保存当前流水号数据到文件
            /// </summary>
            private static void SaveSerialData()
            {
                try
                {
                    // 仅保存三个序列的当前值（无日期，不自动重置）
                    File.WriteAllLines(DataFile, new string[] {
                    serialCounters["SerialA"].ToString(),
                    serialCounters["SerialB"].ToString(),
                    serialCounters["SerialC"].ToString()
                });
                }
                catch
                {
                    // 保存失败时不抛出异常（避免影响主流程）
                }
            }

            /// <summary>
            /// 获取序列A的下一个五位数流水号（格式：00001）
            /// </summary>
            public static string NextSerialA()
            {
                lock (lockObject)
                {
                    serialCounters["SerialA"]++; // 递增（从0→1，对应首个流水号00001）
                    SaveSerialData(); // 保存最新值到文件
                    return serialCounters["SerialA"].ToString("D5"); // D5：固定五位数，不足补0
                }
            }

            /// <summary>
            /// 获取序列B的下一个五位数流水号（格式：00001）
            /// </summary>
            public static string NextSerialB()
            {
                lock (lockObject)
                {
                    serialCounters["SerialB"]++;
                    SaveSerialData();
                    return serialCounters["SerialB"].ToString("D5"); // 关键修改：D5确保五位数格式
                }
            }

            /// <summary>
            /// 获取序列C的下一个五位数流水号（格式：00001）
            /// </summary>
            public static string NextSerialC()
            {
                lock (lockObject)
                {
                    serialCounters["SerialC"]++;
                    SaveSerialData();
                    return serialCounters["SerialC"].ToString("D5");
                }
            }

            /// <summary>
            /// 手动重置所有序列为0（下次生成时从00001开始）
            /// </summary>
            public static void ResetAll()
            {
                lock (lockObject)
                {
                    serialCounters["SerialA"] = 0;
                    serialCounters["SerialB"] = 0;
                    serialCounters["SerialC"] = 0;
                    SaveSerialData(); // 保存重置后的值
                }
            }

            /// <summary>
            /// 获取所有序列的当前状态（五位数格式）
            /// </summary>
            public static string GetStatus()
            {
                return $"序列A: {serialCounters["SerialA"]:D5}, " +
                       $"序列B: {serialCounters["SerialB"]:D5}, " +
                       $"序列C: {serialCounters["SerialC"]:D5}";
            }
        }
    }
}
